#include "Mepa.h"

Mepa::Mepa(NoArvore & arvore)
{
	this->mI = 0;
	this->mS = 0;
	this->mArvoreSintatica = arvore;
}

/**
 * Nao esquecer que toda instrucao incrementa mI, exceto desvio
 */

/**
 * Iniciar programa principal - 3cop066-a13-t03
 */
void Mepa::IniciaProgramaPrincipal()
{
	mArquivoSaida.ImprimeSaidaMepa("INPP");
}
/**
 * Aloca memoria - 3cop066-a13-t03
 * Se pa isso aqui ta meio gambi, mas achei melhor que usar itoa()
 */
 
 
void Mepa::AlocarMemoria(int quantidade)
{
	string comando;
	char *qtd;
	comando = "AMEM ";
	sprintf(qtd, "%d", quantidade);
	comando += qtd;
	mArquivoSaida.ImprimeSaidaMepa(comando);
}
/**
 * Para a execucao da mepa - 3cop066-a13-t03
 */
void Mepa::Para()
{
	mArquivoSaida.ImprimeSaidaMepa("PARA");
}

/**
 * Armazenar Valor - 3cop066-a14-t03
 */
void Mepa::ArmazenarValor(int valor, int quantidade)
{
	string comando;
	char *value;
	comando = "ARMZ ";
	sprintf(value, "%d", valor);
	comando += value;
	comando += ",";
	sprintf(value, "%d", quantidade);
	comando += value;
	mArquivoSaida.ImprimeSaidaMepa(comando);
}
/**
 * Desviar Sempre - 3cop066-a13-t03
 */
void Mepa::DesviarSempre(int posicao)
{
	string comando;
	char *pos;
	comando = "DSVS ";
	sprintf(pos, "%d", posicao);
	comando += posicao;
	mArquivoSaida.ImprimeSaidaMepa(comando);
}

/**
 * Desviar se falso - 3cop066-a13-t03
 */
void Mepa::DesvioFalso(int posicao)
{
	string comando;
	char *pos;
	comando = "DSVF ";
	sprintf(pos, "%d", posicao);
	comando += posicao;
	mArquivoSaida.ImprimeSaidaMepa(comando);
}

/**
 * Nao faz nada - 3cop066-a13-t03
 */
void Mepa::Nada()
{
	mArquivoSaida.ImprimeSaidaMepa("NADA");
}

/**
 * Realiza uma leitura de dados - 3cop066-a13-t03 
 */
void Mepa::Leitura()
{
	mArquivoSaida.ImprimeSaidaMepa("LEIT");
}

/**
 * Imprime um dado da pilha - 3cop066-a13-t03
 */
void Mepa::Imprimir()
{
	mArquivoSaida.ImprimeSaidaMepa("IMPR");
}

/**
 * Imprime um valor e pula uma linha - 3cop066-a13-t03
 */
void Mepa::Println()
{
	mArquivoSaida.ImprimeSaidaMepa("IMPL");
}
/**
 * Imprime um caractere e inicia nova linha - 3cop066-a13-t03
 */
void Mepa::ImprimeCaractere()
{
	mArquivoSaida.ImprimeSaidaMepa("IMPC");
}

/**
 * Carrega uma constante - 3cop066-a13-t03
 */
void Mepa::CarregaConstante(int constante)
{
	string comando;
	char *value;
	comando = "CRCT ";
	sprintf(value, "%d", constante);
	comando += value;
	mArquivoSaida.ImprimeSaidaMepa(comando);
}

/**
 * Carrega um valor - 3cop066-a14-t03
 */
void Mepa::CarregaValor(int valor, int quantidade)
{
	string comando;
	char *value;
	comando = "CRVL ";
	sprintf(value, "%d", valor);
	comando += value;
	comando +=",";
	sprintf(value, "%d", quantidade);
	comando += value;
	mArquivoSaida.ImprimeSaidaMepa(comando);
}

/**
 * Realiza uma soma - 3cop066-a13-t03
 */
void Mepa::Soma()
{
	mArquivoSaida.ImprimeSaidaMepa("SOMA");
}

/**
 * Realiza uma substracao - 3cop066-a13-t03
 */
void Mepa::Subtrai()
{
	mArquivoSaida.ImprimeSaidaMepa("SUBT");
}

/**
 * Realiza uma multiplicacao - 3cop066-a13-t03
 */
void Mepa::Multiplica()
{
	mArquivoSaida.ImprimeSaidaMepa("MULT");
}

/**
 * Realiza uma divisao - 3cop066-a13-t03
 */
void Mepa::Divide()
{
	mArquivoSaida.ImprimeSaidaMepa("DIVI");
}

void Mepa::InverterSinal()
{
	mArquivoSaida.ImprimeSaidaMepa("INVR");
}
/**
 * Continuando as instru��es do Arquivo afim de testes posteriores
 */
 void Mepa::Nega()
 {
 	mArquivoSaida.ImprimeSaidaMepa("NEGA");
 }
 /**
  * Compara o menor elemento presente nos registrados da pilha
  */
void Mepa::ComparaMenor()
{
	this->mArquivoSaida.ImprimeSaidaMepa("CMME");
}
void Mepa::ComparaMaior()
{
	this->mArquivoSaida.ImprimeSaidaMepa("CMMA");
}
void Mepa::ComparaIgual()
{
	this->mArquivoSaida.ImprimeSaidaMepa("CMIG");
}
void Mepa::ComparaDesigual()
{
	this->mArquivoSaida.ImprimeSaidaMepa("CMDG");
}
void Mepa::ComparaMenorIgual()
{
	this->mArquivoSaida.ImprimeSaidaMepa("CMEG");
}
void Mepa::ComparaMaiorIgual()
{
	this->mArquivoSaida.ImprimeSaidaMepa("CMAG");
}
void Mepa::Disjuncao()
{
	this->mArquivoSaida.ImprimeSaidaMepa("DISJ");
}
void Mepa::Conjuncao()
{
	this->mArquivoSaida.ImprimeSaidaMepa("CONJ");
}
/**
 * Chamar um procedimento - 3cop066-a14-t03
 */
void Mepa::ChamarProcedimento(int nivel)
{
	string comando;
	char *value;
	comando = "CHPR ";
	sprintf(value, "%d", nivel);
	comando += value;
	mArquivoSaida.ImprimeSaidaMepa(comando);
}

/**
 * Entrar em um procedimento de nivel k - 3cop066-a14-t03
 */
void Mepa::EntrarProcedimento(int nivel)
{
	string comando;
	char *value;
	comando = "ENPR ";
	sprintf(value, "%d", nivel);
	comando += value;
	mArquivoSaida.ImprimeSaidaMepa(comando);
}

/**
 * Retorna do procedimento de nivel k - 3cop066-a14-t04
 */
void Mepa::RetornarProcedimento(int nivel, int quantidade) 
{
	string comando;
	char *value;
	comando = "RTPR ";
	sprintf(value, "%d", nivel);
	comando += value;
	comando += ",";
	sprintf(value, "%d", quantidade);
	comando += value;
	mArquivoSaida.ImprimeSaidaMepa(comando);
}

/**
 * Desaloca uma quantidade definida de memoria - 3cop066-a14-t03
 */
void Mepa::DesalocaMemoria(int quantidade)
{
	string comando;
	char *value;
	comando = "DMEM ";
	sprintf(value, "%d", quantidade);
	comando += value;
	mArquivoSaida.ImprimeSaidaMepa(comando);
}
/**
 * Carrega valor indireto (referencia) - 3cop066-a15-t01
 */
void Mepa::CarregarValorIndireto(int valor, int quantidade)
{
	string comando;
	char *value;
	comando = "CRVI ";
	sprintf(value, "%d", valor);
	comando += value;
	comando += ",";
	sprintf(value, "%d", quantidade);
	comando += value;
	mArquivoSaida.ImprimeSaidaMepa(comando);
}

/**
 * Armazenar valor indireto (referencia) - 3cop066-a15-t01
 */
void Mepa::ArmazenarValorIndireto(int valor, int quantidade)
{
	string comando;
	char *value;
	comando = "ARMI ";
	sprintf(value, "%d", valor);
	comando += value;
	comando += ",";
	sprintf(value, "%d", quantidade);
	comando += value;
	mArquivoSaida.ImprimeSaidaMepa(comando);
}

/**
 * Carrega um endereco - 3cop066-a15-t01
 */
void Mepa::CarregarEndereco(int valor, int quantidade)
{
	string comando;
	char *value;
	comando = "CREN ";
	sprintf(value, "%d", valor);
	comando += value;
	comando += ",";
	sprintf(value, "%d", quantidade);
	comando += value;
	mArquivoSaida.ImprimeSaidaMepa(comando);
}

/**
 * Mostra o estado da memoria da Maquina Virtual Mepa - 3cop066-a16-t02
 */
void Mepa::MostrarMemoria()
{
	mArquivoSaida.ImprimeSaidaMepa("MOSM");
}

Mepa::~Mepa()
{
}
